JavaScript์ ๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ๊ฐ ์คํธ๋ฆผ ์ฒ๋ฆฌ์ ๊ฐ๋ ฅํ ์ฑ๋ฅ ์์ง์ผ๋ก ์๋ํ์ฌ ๊ธ๋ก๋ฒ ๊ท๋ชจ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ฐ์ดํฐ ํ๋ฆ, ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ๋ฐ ์๋ต์ฑ์ ์ต์ ํํ๋ ๋ฐฉ๋ฒ์ ํ์ํฉ๋๋ค.
JavaScript ๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ ์ฑ๋ฅ ์์ง ๋ฐํ: ๊ธ๋ก๋ฒ ๊ท๋ชจ์ ์คํธ๋ฆผ ์ฒ๋ฆฌ ์ต์ ํ
์ค๋๋ ์ํธ ์ฐ๊ฒฐ๋ ์ธ์์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋์์์ด ๋ฐฉ๋ํ ์์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ณ ์์ต๋๋ค. ์๊ฒฉ IoT ์ฅ์น์์ ์คํธ๋ฆฌ๋ฐ๋๋ ์ค์๊ฐ ์ผ์ ํ๋ ๊ฐ๋ถํฐ ๋ฐฉ๋ํ ๊ธ์ต ๊ฑฐ๋ ๋ก๊ทธ์ ์ด๋ฅด๊ธฐ๊น์ง ํจ์จ์ ์ธ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ ๋งค์ฐ ์ค์ํฉ๋๋ค. ๊ธฐ์กด ์ ๊ทผ ๋ฐฉ์์ ๋ฆฌ์์ค ๊ด๋ฆฌ์์ ์ข ์ข ์ด๋ ค์์ ๊ฒช์ผ๋ฉฐ, ์ง์์ ์ด๊ณ ๋ฌดํํ ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ์ง๋ฉดํ ๋ ๋ฉ๋ชจ๋ฆฌ ๊ณ ๊ฐ ๋๋ ๋๋ฆฐ ์ฑ๋ฅ์ผ๋ก ์ด์ด์ง๋๋ค. ๋ฐ๋ก ์ด ์ง์ ์์ JavaScript์ ๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ๋ ๋ค์ํ ๊ธ๋ก๋ฒ ๋ถ์ฐ ์์คํ ์ ๋ฐ์ ๊ฑธ์ณ ์คํธ๋ฆผ ์ฒ๋ฆฌ๋ฅผ ์ต์ ํํ๊ธฐ ์ํ ์ ๊ตํ๊ณ ์ฐ์ํ ์๋ฃจ์ ์ ์ ๊ณตํ๋ ๊ฐ๋ ฅํ '์ฑ๋ฅ ์์ง'์ผ๋ก ๋ฑ์ฅํฉ๋๋ค.
์ด ์ข ํฉ ๊ฐ์ด๋์์๋ ๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ๊ฐ ํ๋ ฅ์ ์ด๊ณ ํ์ฅ ๊ฐ๋ฅํ๋ฉฐ ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ ์ธ ๋ฐ์ดํฐ ํ์ดํ๋ผ์ธ์ ๊ตฌ์ถํ๊ธฐ ์ํ ๊ธฐ๋ณธ์ ์ธ ๋ฉ์ปค๋์ฆ์ ์ด๋ป๊ฒ ์ ๊ณตํ๋์ง ์์ธํ ๋ค๋ฃน๋๋ค. ์ฐ๋ฆฌ๋ ๊ธ๋ก๋ฒ ์ํฅ๊ณผ ์ค์ ์๋๋ฆฌ์ค์ ๊ด์ ์์ ๊ทธ๋ค์ ํต์ฌ ์์น, ์ค์ ์ ์ฉ ๋ฐ ๊ณ ๊ธ ์ต์ ํ ๊ธฐ์ ์ ํ์ํ ๊ฒ์ ๋๋ค.
ํต์ฌ ์ดํด: ๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ๋ ๋ฌด์์ธ๊ฐ?
์ฑ๋ฅ์ ๋ํด ์์ธํ ์์๋ณด๊ธฐ ์ ์ ๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ๊ฐ ๋ฌด์์ธ์ง ๋ช
ํํ๊ฒ ์ดํดํด๋ด
์๋ค. ECMAScript 2018์ ๋์
๋ ์ดํฐ๋ ์ดํฐ๋ ์ต์ํ ๋๊ธฐ์ ๋ฐ๋ณต ํจํด(for...of ๋ฃจํ์ ๊ฐ์)์ ํ์ฅํ์ฌ ๋น๋๊ธฐ ๋ฐ์ดํฐ ์์ค๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค.
The Symbol.asyncIterator ๋ฐ for await...of
๊ฐ์ฒด๋ Symbol.asyncIterator๋ฅผ ํตํด ์ ๊ทผ ๊ฐ๋ฅํ ๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ ์๋ค๋ฉด ๋น๋๊ธฐ ์ดํฐ๋ฌ๋ธ๋ก ๊ฐ์ฃผ๋ฉ๋๋ค. ์ด ๋ฉ์๋๋ ํธ์ถ๋ ๋ ๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ๋ฅผ ๋ฐํํฉ๋๋ค. ๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ๋ next() ๋ฉ์๋๋ฅผ ๊ฐ์ง ๊ฐ์ฒด์ด๋ฉฐ, ์ด ๋ฉ์๋๋ ๋๊ธฐ์ ์ดํฐ๋ ์ดํฐ์ ์ ์ฌํ์ง๋ง Promise๋ก ๋ํ๋ { value: any, done: boolean } ํํ์ ๊ฐ์ฒด๋ก resolve๋๋ Promise๋ฅผ ๋ฐํํฉ๋๋ค.
for await...of ๋ฃจํ์์ ๋ง๋ฒ์ด ์ผ์ด๋ฉ๋๋ค. ์ด ๊ตฌ๋ฌธ์ ๋น๋๊ธฐ ์ดํฐ๋ฌ๋ธ์ ๋ฐ๋ณตํ ์ ์๋๋ก ํ๋ฉฐ, ๊ฐ ๋ค์ ๊ฐ์ด ์ค๋น๋ ๋๊น์ง ์คํ์ ์ผ์ ์ค์งํ์ฌ ์คํธ๋ฆผ์ ๋ค์ ๋ฐ์ดํฐ ์กฐ๊ฐ์ ํจ๊ณผ์ ์ผ๋ก '๊ธฐ๋ค๋ฆฝ๋๋ค'. ์ด๋ฌํ ๋น๋ธ๋กํน ํน์ฑ์ I/O ๋ฐ์ด๋ ์์
์์ ์ฑ๋ฅ์ ๋งค์ฐ ์ค์ํฉ๋๋ค.
async function* generateAsyncSequence() {
yield await Promise.resolve(1);
yield await Promise.resolve(2);
yield await Promise.resolve(3);
}
async function consumeSequence() {
for await (const num of generateAsyncSequence()) {
console.log(num);
}
console.log("Async sequence complete.");
}
// To run:
// consumeSequence();
์ฌ๊ธฐ์ generateAsyncSequence๋ ๋น๋๊ธฐ ์ ๋๋ ์ดํฐ ํจ์์ด๋ฉฐ, ์์ฐ์ค๋ฝ๊ฒ ๋น๋๊ธฐ ์ดํฐ๋ฌ๋ธ์ ๋ฐํํฉ๋๋ค. for await...of ๋ฃจํ๋ ๊ฐ์ด ๋น๋๊ธฐ์ ์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅํด์ง ๋ ํด๋น ๊ฐ์ ์๋นํฉ๋๋ค.
"์ฑ๋ฅ ์์ง" ์์ : ๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ๊ฐ ํจ์จ์ฑ์ ์ด๋๋ ๋ฐฉ๋ฒ
์ง์์ ์ธ ๋ฆฌ์์ค ํ๋ฆ์ ์ฒ๋ฆฌํ๋๋ก ์ค๊ณ๋ ์ ๊ตํ ์์ง์ ์์ํด๋ณด์ธ์. ์ด ์์ง์ ๋ชจ๋ ๊ฒ์ ํ ๋ฒ์ ์ผํค์ง ์๊ณ , ํจ์จ์ ์ผ๋ก, ์จ๋๋งจ๋๋ก, ๊ทธ๋ฆฌ๊ณ ํก์ ์๋๋ฅผ ์ ๋ฐํ๊ฒ ์ ์ดํ๋ฉฐ ๋ฆฌ์์ค๋ฅผ ์๋นํฉ๋๋ค. JavaScript์ ๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ๋ ์ด์ ์ ์ฌํ๊ฒ ์๋ํ๋ฉฐ, ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ์ํ ์ง๋ฅ์ ์ธ '์ฑ๋ฅ ์์ง' ์ญํ ์ ํฉ๋๋ค.
- ์ ์ด๋ ๋ฆฌ์์ค ํก์
:
for await...of๋ฃจํ๋ ์ค๋กํ ์ญํ ์ ํฉ๋๋ค. ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ์ค๋น๊ฐ ๋์์ ๋๋ง ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ ์์คํ ์ด ๋๋ฌด ๋ง์ ๋ฐ์ดํฐ๋ก ๋๋ฌด ๋นจ๋ฆฌ ๊ณผ๋ถํ๋๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค. - ๋น๋ธ๋กํน ์์ : ๋ค์ ๋ฐ์ดํฐ ์ฒญํฌ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ๋์ JavaScript ์ด๋ฒคํธ ๋ฃจํ๋ ๋ค๋ฅธ ์์ ์ ์ฒ๋ฆฌํ ์ ์์ด ์ ํ๋ฆฌ์ผ์ด์ ์ด ์๋ต์ฑ์ ์ ์งํ๋๋ก ๋ณด์ฅํ๋ฉฐ, ์ด๋ ์ฌ์ฉ์ ๊ฒฝํ๊ณผ ์๋ฒ ์์ ์ฑ์ ๋งค์ฐ ์ค์ํฉ๋๋ค.
- ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ์ต์ ํ: ๋ฐ์ดํฐ๋ ์ ์ฒด ๋ฐ์ดํฐ์ ์ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋ํ๋ ๋์ ์ฆ๋ถ์ ์ผ๋ก, ์กฐ๊ฐ๋ณ๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค. ์ด๋ ๋์ฉ๋ ํ์ผ ๋๋ ๋ฌดํ ์คํธ๋ฆผ์ ์ฒ๋ฆฌํ๋ ๋ฐ ์์ด ํ์ ์ ์ธ ๋ณํ์ ๋๋ค.
- ํ๋ ฅ์ฑ ๋ฐ ์ค๋ฅ ์ฒ๋ฆฌ: ์์ฐจ์ ์ด๊ณ Promise ๊ธฐ๋ฐ์ ํน์ฑ์ ์คํธ๋ฆผ ๋ด์์ ๊ฐ๋ ฅํ ์ค๋ฅ ์ ํ ๋ฐ ์ฒ๋ฆฌ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ์ฌ ์ ์์ ์ธ ๋ณต๊ตฌ ๋๋ ์ข ๋ฃ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
์ด ์์ง์ ๊ฐ๋ฐ์๊ฐ ๋ค์ํ ๊ธ๋ก๋ฒ ์์ค์์ ์ค๋ ๋ฐ์ดํฐ๋ฅผ ๋๊ธฐ ์๊ฐ์ด๋ ๋ณผ๋ฅจ ํน์ฑ์ ๊ด๊ณ์์ด ์ํํ๊ฒ ์ฒ๋ฆฌํ ์ ์๋ ๊ฒฌ๊ณ ํ ์์คํ ์ ๊ตฌ์ถํ ์ ์๋๋ก ํฉ๋๋ค.
๊ธ๋ก๋ฒ ์ปจํ ์คํธ์์ ์คํธ๋ฆผ ์ฒ๋ฆฌ๊ฐ ์ค์ํ ์ด์
๋ฐ์ดํฐ๊ฐ ์๋ง์ ์์ค์์ ๋ฐ์ํ๊ณ , ๋ค์ํ ๋คํธ์ํฌ๋ฅผ ๊ฑฐ์ณ ์์ ์ ์ผ๋ก ์ฒ๋ฆฌ๋์ด์ผ ํ๋ ๊ธ๋ก๋ฒ ํ๊ฒฝ์์๋ ํจ์จ์ ์ธ ์คํธ๋ฆผ ์ฒ๋ฆฌ์ ํ์์ฑ์ด ๋์ฑ ์ฆํญ๋ฉ๋๋ค.
- IoT ๋ฐ ์ผ์ ๋คํธ์ํฌ: ๋ ์ผ์ ์ ์กฐ ๊ณต์ฅ, ๋ธ๋ผ์ง์ ๋๊ฒฝ์ง, ํธ์ฃผ์ ํ๊ฒฝ ๋ชจ๋ํฐ๋ง ์คํ ์ด์ ์ ๊ฑธ์ณ ์๋ฐฑ๋ง ๊ฐ์ ์ค๋งํธ ์ผ์๊ฐ ์ง์์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๋ ์ํฉ์ ์์ํด ๋ณด์ธ์. ๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํฌํ์ํค๊ฑฐ๋ ์ค์ํ ์์ ์ ์ฐจ๋จํ์ง ์๊ณ ์ด๋ฌํ ์์ ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
- ์ค์๊ฐ ๊ธ์ต ๊ฑฐ๋: ์ํ ๋ฐ ๊ธ์ต ๊ธฐ๊ด์ ๋ค์ํ ์๊ฐ๋์์ ๋ฐ์ํ๋ ์์ญ์ต ๊ฑด์ ๊ฑฐ๋๋ฅผ ๋งค์ผ ์ฒ๋ฆฌํฉ๋๋ค. ๋น๋๊ธฐ ์คํธ๋ฆผ ์ฒ๋ฆฌ ์ ๊ทผ ๋ฐฉ์์ ๊ฑฐ๋๊ฐ ํจ์จ์ ์ผ๋ก ๊ฒ์ฆ, ๊ธฐ๋ก ๋ฐ ์กฐ์ ๋๋๋ก ๋ณด์ฅํ์ฌ ๋์ ์ฒ๋ฆฌ๋๊ณผ ๋ฎ์ ๋๊ธฐ ์๊ฐ์ ์ ์งํฉ๋๋ค.
- ๋์ฉ๋ ํ์ผ ์ ๋ก๋/๋ค์ด๋ก๋: ์ ์ธ๊ณ ์ฌ์ฉ์๋ ๋์ฉ๋ ๋ฏธ๋์ด ํ์ผ, ๊ณผํ ๋ฐ์ดํฐ์ ๋๋ ๋ฐฑ์ ์ ์ ๋ก๋ํ๊ณ ๋ค์ด๋ก๋ํฉ๋๋ค. ๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฌํ ํ์ผ์ ์ฒญํฌ ๋จ์๋ก ์ฒ๋ฆฌํ๋ฉด ์๋ฒ ๋ฉ๋ชจ๋ฆฌ ๊ณ ๊ฐ์ ๋ฐฉ์งํ๊ณ ์งํ ์ํฉ์ ์ถ์ ํ ์ ์์ต๋๋ค.
- API ํ์ด์ง ๋งค๊น ๋ฐ ๋ฐ์ดํฐ ๋๊ธฐํ: ํ์ด์ง ๋งค๊น๋ API(์: ๊ธ๋ก๋ฒ ๊ธฐ์ ์๋น์ค์์ ๊ณผ๊ฑฐ ๋ ์จ ๋ฐ์ดํฐ ๊ฒ์ ๋๋ ์์ ํ๋ซํผ์์ ์ฌ์ฉ์ ๋ฐ์ดํฐ ๊ฒ์)๋ฅผ ์ฌ์ฉํ ๋ ๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ๋ ์ด์ ํ์ด์ง๊ฐ ์ฒ๋ฆฌ๋ ํ์๋ง ๋ค์ ํ์ด์ง๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ์ ๊ฐ์ํํ์ฌ ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ ๋ณด์ฅํ๊ณ ๋คํธ์ํฌ ๋ถํ๋ฅผ ์ค์ ๋๋ค.
- ๋ฐ์ดํฐ ํ์ดํ๋ผ์ธ (ETL): ๋ถ์์ ์ํด ์ด๊ธฐ์ข ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋๋ ๋ฐ์ดํฐ ๋ ์ดํฌ์์ ๋์ฉ๋ ๋ฐ์ดํฐ์ ์ ์ถ์ถ, ๋ณํ, ๋ก๋(ETL)ํ๋ ์์ ์ ์ข ์ข ๋๊ท๋ชจ ๋ฐ์ดํฐ ์ด๋์ ์๋ฐํฉ๋๋ค. ๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ๋ ๋ค๋ฅธ ์ง๋ฆฌ์ ๋ฐ์ดํฐ ์ผํฐ๋ฅผ ๊ฐ๋ก์ง๋ฌ์๋ ์ด๋ฌํ ํ์ดํ๋ผ์ธ์ ์ ์ง์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋๋ก ํฉ๋๋ค.
์ด๋ฌํ ์๋๋ฆฌ์ค๋ฅผ ์ํํ๊ฒ ์ฒ๋ฆฌํ๋ ๋ฅ๋ ฅ์ ๋ฐ์ดํฐ์ ์ถ์ฒ๋ ๋ณผ๋ฅจ์ ๊ด๊ณ์์ด ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ ์ธ๊ณ ์ฌ์ฉ์ ๋ฐ ์์คํ ์ ๋ํด ์ฑ๋ฅ์ ์ ์งํ๊ณ ๊ฐ์ฉํ๋๋ก ํจ์ ์๋ฏธํฉ๋๋ค.
๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ๋ฅผ ํตํ ํต์ฌ ์ต์ ํ ์์น
์ฑ๋ฅ ์์ง์ผ๋ก์ ๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ์ ์ง์ ํ ํ์ ๊ทธ๋ค์ด ์์ฐ์ค๋ฝ๊ฒ ๊ฐ์ ํ๊ฑฐ๋ ์ด์งํ๋ ๋ช ๊ฐ์ง ๊ธฐ๋ณธ ์์น์ ์์ต๋๋ค.
1. ์ง์ฐ ํ๊ฐ: ์จ๋๋งจ๋ ๋ฐ์ดํฐ
๋๊ธฐ์ ๋ฐ ๋น๋๊ธฐ์ ์ดํฐ๋ ์ดํฐ์ ๊ฐ์ฅ ์ค์ํ ์ฑ๋ฅ ์ด์ ์ค ํ๋๋ ์ง์ฐ ํ๊ฐ์ ๋๋ค. ๋ฐ์ดํฐ๋ ์๋น์์ ์ํด ๋ช ์์ ์ผ๋ก ์์ฒญ๋ ๋๊น์ง ์์ฑ๋๊ฑฐ๋ ๊ฐ์ ธ์ค์ง ์์ต๋๋ค. ์ด๋ ๋ค์์ ์๋ฏธํฉ๋๋ค.
- ์ค์ด๋ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋: ์ ์ฒด ๋ฐ์ดํฐ์ (์ ๊ธฐ๊ฐ๋ฐ์ดํธ ๋๋ ์ ํ ๋ผ๋ฐ์ดํธ์ ๋ฌํ ์ ์์)์ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋ํ๋ ๋์ , ํ์ฌ ์ฒ๋ฆฌ ์ค์ธ ์ฒญํฌ๋ง ๋ฉ๋ชจ๋ฆฌ์ ์์ฃผํฉ๋๋ค.
- ๋ ๋น ๋ฅธ ์์ ์๊ฐ: ์คํธ๋ฆผ ์ ์ฒด๊ฐ ์ค๋น๋ ๋๊น์ง ๊ธฐ๋ค๋ฆด ํ์ ์์ด ์ฒ์ ๋ช ํญ๋ชฉ์ ๊ฑฐ์ ์ฆ์ ์ฒ๋ฆฌ๋ ์ ์์ต๋๋ค.
- ํจ์จ์ ์ธ ๋ฆฌ์์ค ์ฌ์ฉ: ์๋น์๊ฐ ๋งค์ฐ ๊ธด ์คํธ๋ฆผ์์ ๋ช ๊ฐ์ ํญ๋ชฉ๋ง ํ์๋ก ํ๋ ๊ฒฝ์ฐ, ์์ฐ์๋ ์ผ์ฐ ์ค๋จํ์ฌ ๊ณ์ฐ ๋ฆฌ์์ค์ ๋คํธ์ํฌ ๋์ญํญ์ ์ ์ฝํ ์ ์์ต๋๋ค.
์๋ฒ ํด๋ฌ์คํฐ์ ๋ก๊ทธ ํ์ผ์ ์ฒ๋ฆฌํ๋ ์๋๋ฆฌ์ค๋ฅผ ๊ณ ๋ คํด ๋ณด์ธ์. ์ง์ฐ ํ๊ฐ๋ฅผ ์ฌ์ฉํ๋ฉด ์ ์ฒด ๋ก๊ทธ๋ฅผ ๋ก๋ํ์ง ์๊ณ ํ ์ค์ ์ฝ๊ณ ์ฒ๋ฆฌํ ๋ค์ ๋ค์ ์ค์ ์ฝ์ต๋๋ค. ์ฐพ๊ณ ์๋ ์ค๋ฅ๋ฅผ ์ผ์ฐ ๋ฐ๊ฒฌํ๋ฉด ์ค๋จํ์ฌ ์๋นํ ์ฒ๋ฆฌ ์๊ฐ๊ณผ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ์ฝํ ์ ์์ต๋๋ค.
2. ๋ฐฑํ๋ ์ ์ฒ๋ฆฌ: ๊ณผ๋ถํ ๋ฐฉ์ง
๋ฐฑํ๋ ์ ๋ ์คํธ๋ฆผ ์ฒ๋ฆฌ์์ ์ค์ํ ๊ฐ๋ ์ ๋๋ค. ์ด๋ ์๋น์๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋๋ฌด ๋๋ฆฌ๊ฒ ์ฒ๋ฆฌํ๊ณ ์์ผ๋ฏ๋ก ์์ฐ์์๊ฒ ์๋๋ฅผ ๋ฆ์ถ๋ผ๊ณ ์ ํธ๋ฅผ ๋ณด๋ผ ์ ์๋ ๋ฅ๋ ฅ์ ๋๋ค. ๋ฐฑํ๋ ์ ๊ฐ ์์ผ๋ฉด ๋น ๋ฅธ ์์ฐ์๊ฐ ๋๋ฆฐ ์๋น์๋ฅผ ์๋ํ์ฌ ๋ฒํผ ์ค๋ฒํ๋ก, ๋๊ธฐ ์๊ฐ ์ฆ๊ฐ ๋ฐ ์ ์ฌ์ ์ธ ์ ํ๋ฆฌ์ผ์ด์ ์ถฉ๋๋ก ์ด์ด์ง ์ ์์ต๋๋ค.
for await...of ๋ฃจํ๋ ๋ณธ์ง์ ์ผ๋ก ๋ฐฑํ๋ ์
๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฃจํ๊ฐ ํญ๋ชฉ์ ์ฒ๋ฆฌํ ๋ค์ await๋ฅผ ๋ง๋๋ฉด ํด๋น await๊ฐ resolve๋ ๋๊น์ง ์คํธ๋ฆผ์ ์๋น๋ฅผ ์ผ์ ์ค์งํฉ๋๋ค. ์์ฐ์(๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ์ next() ๋ฉ์๋)๋ ํ์ฌ ํญ๋ชฉ์ด ์์ ํ ์ฒ๋ฆฌ๋๊ณ ์๋น์๊ฐ ๋ค์ ํญ๋ชฉ์ ์ค๋นํ ๋๋ง ๋ค์ ํธ์ถ๋ฉ๋๋ค.
์ด๋ฌํ ์๋ฌต์ ๋ฐฑํ๋ ์ ๋ฉ์ปค๋์ฆ์ ํนํ ๋คํธ์ํฌ ์กฐ๊ฑด์ด ๋งค์ฐ ๊ฐ๋ณ์ ์ด๊ฑฐ๋ ๋๊ธฐ ์๊ฐ์ด ๋ค๋ฅธ ์ ์ธ๊ณ ๋ค์ํ ์์ค์์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ๋ ์คํธ๋ฆผ ๊ด๋ฆฌ๋ฅผ ํฌ๊ฒ ๋จ์ํํฉ๋๋ค. ์ด๋ ์์ ์ ์ด๊ณ ์์ธก ๊ฐ๋ฅํ ํ๋ฆ์ ๋ณด์ฅํ์ฌ ์์ฐ์์ ์๋น์ ๋ชจ๋๋ฅผ ๋ฆฌ์์ค ๊ณ ๊ฐ๋ก๋ถํฐ ๋ณดํธํฉ๋๋ค.
3. ๋์์ฑ vs. ๋ณ๋ ฌ์ฑ: ์ต์ ์ ์์ ์ค์ผ์ค๋ง
JavaScript๋ ๊ทผ๋ณธ์ ์ผ๋ก ๋จ์ผ ์ค๋ ๋์
๋๋ค(๋ธ๋ผ์ฐ์ ์ ๋ฉ์ธ ์ค๋ ๋ ๋ฐ Node.js ์ด๋ฒคํธ ๋ฃจํ์์). ๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ๋ ์๋ต์ฑ์ ์ ์งํ๊ธฐ ์ํด ์ง์ ํ ๋ณ๋ ฌ์ฑ(Web Workers ๋๋ worker threads๋ฅผ ์ฌ์ฉํ์ง ์๋ ํ)์ด ์๋ ๋์์ฑ์ ํ์ฉํฉ๋๋ค. await ํค์๋๊ฐ ํ์ฌ ๋น๋๊ธฐ ํจ์์ ์คํ์ ์ผ์ ์ค์งํ๋ ๋์์๋ ์ ์ฒด JavaScript ์ด๋ฒคํธ ๋ฃจํ๋ฅผ ์ฐจ๋จํ์ง ์์ต๋๋ค. ์ด๋ ์ฌ์ฉ์ ์
๋ ฅ ์ฒ๋ฆฌ, ๋คํธ์ํฌ ์์ฒญ ๋๋ ๋ค๋ฅธ ์คํธ๋ฆผ ์ฒ๋ฆฌ์ ๊ฐ์ ๋ค๋ฅธ ๋ณด๋ฅ ์ค์ธ ์์
์ด ๊ณ์ ์งํ๋ ์ ์๋๋ก ํฉ๋๋ค.
์ด๋ ๋ฌด๊ฑฐ์ด ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ์ฒ๋ฆฌํ๋ ๋์์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์๋ต์ฑ์ ์ ์งํ๋ค๋ ์๋ฏธ์ ๋๋ค. ์๋ฅผ ๋ค์ด, ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ธ๋ผ์ฐ์ ๊ฐ ๋ฉ์ถ์ง ์๊ณ ์ฌ์ฉ์๊ฐ UI์ ์ํธ ์์ฉํ ์ ์๋๋ก ํ๋ฉด์ ๋์ฉ๋ ๋น๋์ค ํ์ผ์ ์ฒญํฌ ๋จ์๋ก ๋ค์ด๋ก๋ํ๊ณ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค(๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ ์ฌ์ฉ). ์ด๋ ์ฑ๋ฅ์ด ๋จ์ด์ง๋ ์ฅ์น๋ ๋๋ฆฐ ๋คํธ์ํฌ ์ฐ๊ฒฐ์ ์ฌ์ฉํ๋ ๋ง์ ํด์ธ ์ฌ์ฉ์์๊ฒ ์ํํ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค.
4. ๋ฆฌ์์ค ๊ด๋ฆฌ: ์ ์์ ์ธ ์ข ๋ฃ
๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ๋ ๋ํ ์ ์ ํ ๋ฆฌ์์ค ์ ๋ฆฌ๋ฅผ ์ํ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํฉ๋๋ค. ๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ๊ฐ ๋ถ๋ถ์ ์ผ๋ก ์๋น๋๋ ๊ฒฝ์ฐ(์: ๋ฃจํ๊ฐ ์กฐ๊ธฐ์ ์ค๋จ๋๊ฑฐ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ ๊ฒฝ์ฐ) JavaScript ๋ฐํ์์ ์ดํฐ๋ ์ดํฐ์ ์ ํ์ return() ๋ฉ์๋๋ฅผ ํธ์ถํ๋ ค๊ณ ์๋ํฉ๋๋ค. ์ด ๋ฉ์๋๋ ์ดํฐ๋ ์ดํฐ๊ฐ ํ์ผ ํธ๋ค, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ๋๋ ๋คํธ์ํฌ ์์ผ ๋ซ๊ธฐ์ ๊ฐ์ ํ์ํ ์ ๋ฆฌ๋ฅผ ์ํํ ์ ์๋๋ก ํฉ๋๋ค.
์ ์ฌํ๊ฒ, ์ ํ์ throw() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ดํฐ๋ ์ดํฐ์ ์ค๋ฅ๋ฅผ ์ฃผ์
ํ ์ ์์ผ๋ฉฐ, ์ด๋ ์๋น์ ์ธก์์ ์์ฐ์์๊ฒ ๋ฌธ์ ๋ฅผ ์๋ฆฌ๋ ๋ฐ ์ ์ฉํ ์ ์์ต๋๋ค.
์ด ๊ฐ๋ ฅํ ๋ฆฌ์์ค ๊ด๋ฆฌ๋ ์๋ฒ ์ธก ์ ํ๋ฆฌ์ผ์ด์ ๋๋ IoT ๊ฒ์ดํธ์จ์ด์์ ํํ ๋ฐ์ํ๋ ๋ณต์กํ๊ณ ์ฅ๊ธฐ ์คํ๋๋ ์คํธ๋ฆผ ์ฒ๋ฆฌ ์๋๋ฆฌ์ค์์๋ ๋ฆฌ์์ค๊ฐ ๋์ถ๋์ง ์๋๋ก ๋ณด์ฅํ์ฌ ์์คํ ์์ ์ฑ์ ํฅ์์ํค๊ณ ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ฅธ ์ฑ๋ฅ ์ ํ๋ฅผ ๋ฐฉ์งํฉ๋๋ค.
์ค์ฉ์ ์ธ ๊ตฌํ ๋ฐ ์์
๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ๊ฐ ์ค์ ์ ์ด๊ณ ์ต์ ํ๋ ์คํธ๋ฆผ ์ฒ๋ฆฌ ์๋ฃจ์ ์ผ๋ก ์ด๋ป๊ฒ ์ ํ๋๋์ง ์ดํด๋ณด๊ฒ ์ต๋๋ค.
1. ๋์ฉ๋ ํ์ผ ํจ์จ์ ์ผ๋ก ์ฝ๊ธฐ (Node.js)
Node.js์ fs.createReadStream()์ ์ฝ๊ธฐ ๊ฐ๋ฅํ ์คํธ๋ฆผ์ ๋ฐํํ๋ฉฐ, ์ด๋ ๋น๋๊ธฐ ์ดํฐ๋ฌ๋ธ์
๋๋ค. ์ด๋ ๋์ฉ๋ ํ์ผ์ ๋งค์ฐ ๊ฐ๋จํ๊ณ ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๊ฒ ํฉ๋๋ค.
const fs = require('fs');
const path = require('path');
async function processLargeLogFile(filePath) {
const stream = fs.createReadStream(filePath, { encoding: 'utf8' });
let lineCount = 0;
let errorCount = 0;
console.log(`Starting to process file: ${filePath}`);
try {
for await (const chunk of stream) {
// In a real scenario, you'd buffer incomplete lines
// For simplicity, we'll assume chunks are lines or contain multiple lines
const lines = chunk.split('\n');
for (const line of lines) {
if (line.includes('ERROR')) {
errorCount++;
console.warn(`Found ERROR: ${line.trim()}`);
}
lineCount++;
}
}
console.log(`\nProcessing complete for ${filePath}.`)
console.log(`Total lines processed: ${lineCount}`);
console.log(`Total errors found: ${errorCount}`);
} catch (error) {
console.error(`Error processing file: ${error.message}`);
}
}
// Example usage (ensure you have a large 'app.log' file):
// const logFilePath = path.join(__dirname, 'app.log');
// processLargeLogFile(logFilePath);
์ด ์์ ๋ ๋์ฉ๋ ๋ก๊ทธ ํ์ผ์ ์ ์ฒด์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋ํ์ง ์๊ณ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค. ๊ฐ chunk๋ ์ฌ์ฉ ๊ฐ๋ฅํด์ง๋ ์ฆ์ ์ฒ๋ฆฌ๋๋ฏ๋ก, RAM์ ๋ด๊ธฐ์๋ ๋๋ฌด ํฐ ํ์ผ์ ์ ํฉํ๋ฉฐ, ์ด๋ ์ ์ธ๊ณ ๋ฐ์ดํฐ ๋ถ์ ๋๋ ์์นด์ด๋ธ ์์คํ
์์ ํํ ๋ฐ์ํ๋ ๋ฌธ์ ์
๋๋ค.
2. API ์๋ต ๋น๋๊ธฐ์ ์ผ๋ก ํ์ด์ง ๋งค๊นํ๊ธฐ
ํนํ ๋์ฉ๋ ๋ฐ์ดํฐ์ ์ ์ ๊ณตํ๋ ๋ง์ API๋ ํ์ด์ง ๋งค๊น์ ์ฌ์ฉํฉ๋๋ค. ๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ๋ ๋ค์ ํ์ด์ง๋ฅผ ์๋์ผ๋ก ๊ฐ์ ธ์ค๋ ๊ฒ์ ์ฐ์ํ๊ฒ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
async function* fetchAllPages(baseUrl, initialParams = {}) {
let currentPage = 1;
let hasMore = true;
while (hasMore) {
const params = new URLSearchParams({ ...initialParams, page: currentPage });
const url = `${baseUrl}?${params.toString()}`;
console.log(`Fetching page ${currentPage} from ${url}`);
const response = await fetch(url);
if (!response.ok) {
throw new Error(`API error: ${response.statusText}`);
}
const data = await response.json();
// Assume API returns 'items' and 'nextPage' or 'hasMore'
for (const item of data.items) {
yield item;
}
// Adjust these conditions based on your actual API's pagination scheme
if (data.nextPage) {
currentPage = data.nextPage;
} else if (data.hasOwnProperty('hasMore')) {
hasMore = data.hasMore;
currentPage++;
} else {
hasMore = false;
}
}
}
async function processGlobalUserData() {
// Imagine an API endpoint for user data from a global service
const apiEndpoint = "https://api.example.com/users";
const filterCountry = "IN"; // Example: users from India
try {
for await (const user of fetchAllPages(apiEndpoint, { country: filterCountry })) {
console.log(`Processing user ID: ${user.id}, Name: ${user.name}, Country: ${user.country}`);
// Perform data processing, e.g., aggregation, storage, or further API calls
await new Promise(resolve => setTimeout(resolve, 50)); // Simulate async processing
}
console.log("All global user data processed.");
} catch (error) {
console.error(`Failed to process user data: ${error.message}`);
}
}
// To run:
// processGlobalUserData();
์ด ๊ฐ๋ ฅํ ํจํด์ ํ์ด์ง ๋งค๊น ๋ก์ง์ ์ถ์ํํ์ฌ ์๋น์๊ฐ ์ฐ์์ ์ธ ์ฌ์ฉ์ ์คํธ๋ฆผ์ฒ๋ผ ๋ณด์ด๋ ๊ฒ์ ๋จ์ํ ๋ฐ๋ณตํ ์ ์๋๋ก ํฉ๋๋ค. ์ด๋ ๋ค์ํ ์๋ ์ ํ ๋๋ ๋ฐ์ดํฐ ๋ณผ๋ฅจ์ ๊ฐ์ง ์ ์๋ ๋ค์ํ ๊ธ๋ก๋ฒ API์ ํตํฉํ ๋ ๋งค์ฐ ์ ์ฉํ๋ฉฐ, ํจ์จ์ ์ด๊ณ ๊ท์ ์ค์์ ์ธ ๋ฐ์ดํฐ ๊ฒ์์ ๋ณด์ฅํฉ๋๋ค.
3. ์ฌ์ฉ์ ์ง์ ๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ ๊ตฌ์ถ: ์ค์๊ฐ ๋ฐ์ดํฐ ํผ๋
์น์์ผ์ ์ค์๊ฐ ์ด๋ฒคํธ ํผ๋ ๋๋ ์ฌ์ฉ์ ์ง์ ๋ฉ์์ง ํ์ ๊ฐ์ ์ฌ์ฉ์ ์ง์ ๋ฐ์ดํฐ ์์ค๋ฅผ ๋ชจ๋ธ๋งํ๊ธฐ ์ํด ์์ ๋ง์ ๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
class WebSocketDataFeed {
constructor(url) {
this.url = url;
this.buffer = [];
this.waitingResolvers = [];
this.ws = null;
this.connect();
}
connect() {
this.ws = new WebSocket(this.url);
this.ws.onmessage = (event) => {
const data = JSON.parse(event.data);
if (this.waitingResolvers.length > 0) {
// If there's a consumer waiting, resolve immediately
const resolve = this.waitingResolvers.shift();
resolve({ value: data, done: false });
} else {
// Otherwise, buffer the data
this.buffer.push(data);
}
};
this.ws.onclose = () => {
// Signal completion or error to waiting consumers
while (this.waitingResolvers.length > 0) {
const resolve = this.waitingResolvers.shift();
resolve({ value: undefined, done: true }); // No more data
}
};
this.ws.onerror = (error) => {
console.error('WebSocket Error:', error);
// Propagate error to consumers if any are waiting
};
}
// Make this class an async iterable
[Symbol.asyncIterator]() {
return this;
}
// The core async iterator method
async next() {
if (this.buffer.length > 0) {
return { value: this.buffer.shift(), done: false };
} else if (this.ws && this.ws.readyState === WebSocket.CLOSED) {
return { value: undefined, done: true };
} else {
// No data in buffer, wait for the next message
return new Promise(resolve => this.waitingResolvers.push(resolve));
}
}
// Optional: Clean up resources if iteration stops early
async return() {
if (this.ws && this.ws.readyState === WebSocket.OPEN) {
console.log('Closing WebSocket connection.');
this.ws.close();
}
return { value: undefined, done: true };
}
}
async function processRealtimeMarketData() {
// Example: Imagine a global market data WebSocket feed
const marketDataFeed = new WebSocketDataFeed('wss://marketdata.example.com/live');
let totalTrades = 0;
console.log('Connecting to real-time market data feed...');
try {
for await (const trade of marketDataFeed) {
totalTrades++;
console.log(`New Trade: ${trade.symbol}, Price: ${trade.price}, Volume: ${trade.volume}`);
if (totalTrades >= 10) {
console.log('Processed 10 trades. Stopping for demonstration.');
break; // Stop iteration, triggering marketDataFeed.return()
}
// Simulate some asynchronous processing of the trade data
await new Promise(resolve => setTimeout(resolve, 100));
}
} catch (error) {
console.error('Error processing market data:', error);
} finally {
console.log(`Total trades processed: ${totalTrades}`);
}
}
// To run (in a browser environment or Node.js with a WebSocket library):
// processRealtimeMarketData();
์ด ์ฌ์ฉ์ ์ง์ ๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ๋ ์ด๋ฒคํธ ๊ธฐ๋ฐ ๋ฐ์ดํฐ ์์ค(์น์์ผ๊ณผ ๊ฐ์)๋ฅผ ๋น๋๊ธฐ ์ดํฐ๋ฌ๋ธ๋ก ๋ํํ์ฌ for await...of๋ก ์๋นํ ์ ์๋๋ก ํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค. ์ด๋ ๋ฒํผ๋ง ๋ฐ ์ ๋ฐ์ดํฐ ๋๊ธฐ๋ฅผ ์ฒ๋ฆฌํ๋ฉฐ, ๋ช
์์ ์ธ ๋ฐฑํ๋ ์
์ ์ด์ return()์ ํตํ ๋ฆฌ์์ค ์ ๋ฆฌ๋ฅผ ๋ณด์ฌ์ค๋๋ค. ์ด ํจํด์ ์ ์ธ๊ณ ์ด๋ ๊ณณ์์๋ ๋ฐ์ํ๋ ์ง์์ ์ธ ์ด๋ฒคํธ ์คํธ๋ฆผ์ ์ฒ๋ฆฌํด์ผ ํ๋ ๋ผ์ด๋ธ ๋์๋ณด๋, ๋ชจ๋ํฐ๋ง ์์คํ
๋๋ ํต์ ํ๋ซํผ๊ณผ ๊ฐ์ ์ค์๊ฐ ์ ํ๋ฆฌ์ผ์ด์
์ ๋งค์ฐ ๊ฐ๋ ฅํฉ๋๋ค.
๊ณ ๊ธ ์ต์ ํ ๊ธฐ์
๊ธฐ๋ณธ์ ์ธ ์ฌ์ฉ๋ฒ์ผ๋ก๋ ์๋นํ ์ด์ ์ ์ ๊ณตํ์ง๋ง, ์ถ๊ฐ์ ์ธ ์ต์ ํ๋ฅผ ํตํด ๋ณต์กํ ์คํธ๋ฆผ ์ฒ๋ฆฌ ์๋๋ฆฌ์ค์์ ํจ์ฌ ๋ ํฐ ์ฑ๋ฅ์ ๋ฐํํ ์ ์์ต๋๋ค.
1. ๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ ๋ฐ ํ์ดํ๋ผ์ธ ๊ตฌ์ฑ
๋๊ธฐ์ ์ดํฐ๋ ์ดํฐ์ ๋ง์ฐฌ๊ฐ์ง๋ก ๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ๋ ๊ฐ๋ ฅํ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ํ์ดํ๋ผ์ธ์ ์์ฑํ๊ธฐ ์ํด ๊ตฌ์ฑ๋ ์ ์์ต๋๋ค. ํ์ดํ๋ผ์ธ์ ๊ฐ ๋จ๊ณ๋ ์ด์ ๋จ๊ณ์ ๋ฐ์ดํฐ๋ฅผ ๋ณํํ๊ฑฐ๋ ํํฐ๋งํ๋ ๋น๋๊ธฐ ์ ๋๋ ์ดํฐ๊ฐ ๋ ์ ์์ต๋๋ค.
// A generator that simulates fetching raw data
async function* fetchDataStream() {
const data = [
{ id: 1, tempC: 25, location: 'Tokyo' },
{ id: 2, tempC: 18, location: 'London' },
{ id: 3, tempC: 30, location: 'Dubai' },
{ id: 4, tempC: 22, location: 'New York' },
{ id: 5, tempC: 10, location: 'Moscow' }
];
for (const item of data) {
await new Promise(resolve => setTimeout(resolve, 50)); // Simulate async fetch
yield item;
}
}
// A transformer that converts Celsius to Fahrenheit
async function* convertToFahrenheit(source) {
for await (const item of source) {
const tempF = (item.tempC * 9/5) + 32;
yield { ...item, tempF };
}
}
// A filter that selects data from warmer locations
async function* filterWarmLocations(source, thresholdC) {
for await (const item of source) {
if (item.tempC > thresholdC) {
yield item;
}
}
}
async function processSensorDataPipeline() {
const rawData = fetchDataStream();
const fahrenheitData = convertToFahrenheit(rawData);
const warmFilteredData = filterWarmLocations(fahrenheitData, 20); // Filter > 20C
console.log('Processing sensor data pipeline:');
for await (const processedItem of warmFilteredData) {
console.log(`Location: ${processedItem.location}, Temp C: ${processedItem.tempC}, Temp F: ${processedItem.tempF}`);
}
console.log('Pipeline complete.');
}
// To run:
// processSensorDataPipeline();
Node.js๋ ๋ํ Node.js ์คํธ๋ฆผ์ ๊ตฌ์ฑํ๋ ๊ฐ๋ ฅํ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ pipeline()์ ํฌํจํ stream/promises ๋ชจ๋์ ์ ๊ณตํ๋ฉฐ, ์ด๋ ์ข
์ข
๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ๋ก ๋ณํ๋ ์ ์์ต๋๋ค. ์ด๋ฌํ ๋ชจ๋์ฑ์ ๋ค์ํ ์ง์ญ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์๊ตฌ ์ฌํญ์ ๋ง๊ฒ ์กฐ์ ๋ ์ ์๋ ๋ณต์กํ๊ณ ์ ์ง ๋ณด์ ๊ฐ๋ฅํ ๋ฐ์ดํฐ ํ๋ฆ์ ๊ตฌ์ถํ๋ ๋ฐ ํ์ํฉ๋๋ค.
2. ์์ ๋ณ๋ ฌํ (์ฃผ์ ํ์)
for await...of๋ ์์ฐจ์ ์ด์ง๋ง, ์ดํฐ๋ ์ดํฐ์ next() ๋ฉ์๋ ๋ด์์ ์ฌ๋ฌ ํญ๋ชฉ์ ๋์์ ๊ฐ์ ธ์ค๊ฑฐ๋, ํญ๋ชฉ ๋ฐฐ์น์ Promise.all()๊ณผ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ ์ ๋ ๋ณ๋ ฌ์ฑ์ ๋์
ํ ์ ์์ต๋๋ค.
async function* parallelFetchPages(baseUrl, initialParams = {}, concurrency = 3) {
let currentPage = 1;
let hasMore = true;
const fetchPage = async (pageNumber) => {
const params = new URLSearchParams({ ...initialParams, page: pageNumber });
const url = `${baseUrl}?${params.toString()}`;
console.log(`Initiating fetch for page ${pageNumber} from ${url}`);
const response = await fetch(url);
if (!response.ok) {
throw new Error(`API error on page ${pageNumber}: ${response.statusText}`);
}
return response.json();
};
let pendingFetches = [];
// Start with initial fetches up to concurrency limit
for (let i = 0; i < concurrency && hasMore; i++) {
pendingFetches.push(fetchPage(currentPage++));
if (currentPage > 5) hasMore = false; // Simulate limited pages for demo
}
while (pendingFetches.length > 0) {
const { resolved, index } = await Promise.race(
pendingFetches.map((p, i) => p.then(data => ({ resolved: data, index: i })))
);
// Process items from the resolved page
for (const item of resolved.items) {
yield item;
}
// Remove resolved promise and potentially add a new one
pendingFetches.splice(index, 1);
if (hasMore) {
pendingFetches.push(fetchPage(currentPage++));
if (currentPage > 5) hasMore = false; // Simulate limited pages for demo
}
}
}
async function processHighVolumeAPIData() {
const apiEndpoint = "https://api.example.com/high-volume-data";
console.log('Processing high-volume API data with limited concurrency...');
try {
for await (const item of parallelFetchPages(apiEndpoint, {}, 3)) {
console.log(`Processed item: ${JSON.stringify(item)}`);
// Simulate heavy processing
await new Promise(resolve => setTimeout(resolve, 200));
}
console.log('High-volume API data processing complete.');
} catch (error) {
console.error(`Error in high-volume API data processing: ${error.message}`);
}
}
// To run:
// processHighVolumeAPIData();
์ด ์์ ๋ Promise.race๋ฅผ ์ฌ์ฉํ์ฌ ๋์ ์์ฒญ ํ์ ๊ด๋ฆฌํ๊ณ , ํ๋๊ฐ ์๋ฃ๋๋ ์ฆ์ ๋ค์ ํ์ด์ง๋ฅผ ๊ฐ์ ธ์ต๋๋ค. ์ด๋ ๋๊ธฐ ์๊ฐ์ด ๊ธด ๊ธ๋ก๋ฒ API๋ก๋ถํฐ์ ๋ฐ์ดํฐ ์์ง ์๋๋ฅผ ํฌ๊ฒ ๋์ผ ์ ์์ง๋ง, API ์๋ฒ ๋๋ ์์ฒด ์ ํ๋ฆฌ์ผ์ด์
์ ๋ฆฌ์์ค์ ๊ณผ๋ถํ๊ฐ ๊ฑธ๋ฆฌ์ง ์๋๋ก ๋์์ฑ ์ ํ์ ์ ์คํ๊ฒ ๊ด๋ฆฌํด์ผ ํฉ๋๋ค.
3. ๋ฐฐ์น ์์
๋๋ก๋ ํญ๋ชฉ์ ๊ฐ๋ณ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ ๊ฒ์ด ๋นํจ์จ์ ์ผ ์ ์์ต๋๋ค. ํนํ ์ธ๋ถ ์์คํ (์: ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ธฐ, ํ์ ๋ฉ์์ง ์ ์ก, ๋๋ API ํธ์ถ)๊ณผ ์ํธ ์์ฉํ ๋ ๊ทธ๋ ์ต๋๋ค. ๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ๋ ์ฒ๋ฆฌ ์ ์ ํญ๋ชฉ์ ์ผ๊ด ์ฒ๋ฆฌํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ต๋๋ค.
async function* batchItems(source, batchSize) {
let batch = [];
for await (const item of source) {
batch.push(item);
if (batch.length >= batchSize) {
yield batch;
batch = [];
}
}
if (batch.length > 0) {
yield batch;
}
}
async function processBatchedUpdates(dataStream) {
console.log('Processing data in batches for efficient writes...');
for await (const batch of batchItems(dataStream, 5)) {
console.log(`Processing batch of ${batch.length} items: ${JSON.stringify(batch.map(i => i.id))}`);
// Simulate a bulk database write or API call
await new Promise(resolve => setTimeout(resolve, 500));
}
console.log('Batch processing complete.');
}
// Dummy data stream for demonstration
async function* dummyItemStream() {
for (let i = 1; i <= 12; i++) {
await new Promise(resolve => setTimeout(resolve, 10));
yield { id: i, value: `data_${i}` };
}
}
// To run:
// processBatchedUpdates(dummyItemStream());
๋ฐฐ์น ์ฒ๋ฆฌ๋ I/O ์์ ์๋ฅผ ํฌ๊ฒ ์ค์ฌ Apache Kafka์ ๊ฐ์ ๋ถ์ฐ ํ๋ก ๋ฉ์์ง๋ฅผ ๋ณด๋ด๊ฑฐ๋ ์ ์ธ๊ณ์ ์ผ๋ก ๋ณต์ ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋๋ ์ฝ์ ์ ์ํํ๋ ๊ฒ๊ณผ ๊ฐ์ ์์ ์ ์ฒ๋ฆฌ๋์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
4. ๊ฒฌ๊ณ ํ ์ค๋ฅ ์ฒ๋ฆฌ
ํจ๊ณผ์ ์ธ ์ค๋ฅ ์ฒ๋ฆฌ๋ ๋ชจ๋ ํ๋ก๋์
์์คํ
์ ์ค์ํฉ๋๋ค. ๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ๋ ์๋น์ ๋ฃจํ ๋ด์ ์ค๋ฅ์ ๋ํ ํ์ค try...catch ๋ธ๋ก๊ณผ ์ ํตํฉ๋ฉ๋๋ค. ๋ํ ์์ฐ์(๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ ์์ฒด)๋ ์ค๋ฅ๋ฅผ ๋์ง ์ ์์ผ๋ฉฐ, ์ด๋ ์๋น์์ ์ํด ํฌ์ฐฉ๋ฉ๋๋ค.
async function* unreliableDataSource() {
for (let i = 0; i < 5; i++) {
await new Promise(resolve => setTimeout(resolve, 100));
if (i === 2) {
throw new Error('Simulated data source error at item 2');
}
yield i;
}
}
async function consumeUnreliableData() {
console.log('Attempting to consume unreliable data...');
try {
for await (const data of unreliableDataSource()) {
console.log(`Received data: ${data}`);
}
} catch (error) {
console.error(`Caught error from data source: ${error.message}`);
// Implement retry logic, fallback, or alert mechanisms here
} finally {
console.log('Unreliable data consumption attempt finished.');
}
}
// To run:
// consumeUnreliableData();
์ด ์ ๊ทผ ๋ฐฉ์์ ์ค์ ์ง์ค์ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ๋ฉฐ, ์ฌ๋ฌ ๋ฐ์ดํฐ ์ผํฐ ๋๋ ํด๋ผ์ฐ๋ ์ง์ญ์ ๊ฑธ์ณ ์๋ ๋ถ์ฐ ์์คํ ์์ ํํ ๋ฐ์ํ๋ ์ผ์์ ์ธ ์คํจ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐ ํ์์ ์ธ ์ฌ์๋ ๋ฉ์ปค๋์ฆ ๋๋ ์ํท ๋ธ๋ ์ด์ปค๋ฅผ ๊ตฌํํ๊ธฐ ์ฝ๊ฒ ๋ง๋ญ๋๋ค.
์ฑ๋ฅ ๊ณ ๋ ค ์ฌํญ ๋ฐ ๋ฒค์น๋งํน
๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ๊ฐ ์คํธ๋ฆผ ์ฒ๋ฆฌ์ ์ค์ํ ์ํคํ ์ฒ์ ์ด์ ์ ์ ๊ณตํ์ง๋ง, ๊ทธ ์ฑ๋ฅ ํน์ฑ์ ์ดํดํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
- ์ค๋ฒํค๋: ์์ ์ฝ๋ฐฑ์ด๋ ๊ณ ๋๋ก ์ต์ ํ๋ ์ด๋ฒคํธ ์ด๋ฏธํฐ์ ๋น๊ตํ์ฌ Promise ๋ฐ
async/await๊ตฌ๋ฌธ๊ณผ ๊ด๋ จ๋ ๋ณธ์ง์ ์ธ ์ค๋ฒํค๋๊ฐ ์์ต๋๋ค. ๋งค์ฐ ์์ ๋ฐ์ดํฐ ์ฒญํฌ๋ฅผ ์ฌ์ฉํ๋ ๊ทน๋๋ก ๋์ ์ฒ๋ฆฌ๋, ๋ฎ์ ๋๊ธฐ ์๊ฐ ์๋๋ฆฌ์ค์ ๊ฒฝ์ฐ ์ด ์ค๋ฒํค๋๋ ์ธก์ ๊ฐ๋ฅํ ์ ์์ต๋๋ค. - ์ปจํ
์คํธ ์ค์์นญ: ๊ฐ
await๋ ์ด๋ฒคํธ ๋ฃจํ์์ ์ ์ฌ์ ์ธ ์ปจํ ์คํธ ์ค์์น๋ฅผ ๋ํ๋ ๋๋ค. ๋น๋ธ๋กํน์ด์ง๋ง, ์ฌ์ํ ์์ ์ ๋ํ ๋น๋ฒํ ์ปจํ ์คํธ ์ค์์นญ์ ๋์ ๋ ์ ์์ต๋๋ค. - ์ฌ์ฉ ์๊ธฐ: ๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ๋ I/O ๋ฐ์ด๋ ์์ (๋คํธ์ํฌ, ๋์คํฌ) ๋๋ ๋ฐ์ดํฐ๊ฐ ๋ณธ์ง์ ์ผ๋ก ์๊ฐ์ ๋ฐ๋ผ ์ฌ์ฉ ๊ฐ๋ฅํ ์์ ์ ํนํ ์ ์ฉํฉ๋๋ค. ์ด๋ ์์ํ CPU ์๋๋ณด๋ค๋ ํจ์จ์ ์ธ ๋ฆฌ์์ค ๊ด๋ฆฌ ๋ฐ ์๋ต์ฑ์ ๋ ์ค์ ์ ๋ก๋๋ค.
๋ฒค์น๋งํน: ํญ์ ํน์ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ๋ฒค์น๋งํนํ์ญ์์ค. Node.js์ ๋ด์ฅ perf_hooks ๋ชจ๋ ๋๋ ๋ธ๋ผ์ฐ์ ๊ฐ๋ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ฑ๋ฅ์ ํ๋กํ์ผ๋งํ์ญ์์ค. ์ค์ ๋ฐฑํ๋ ์
์ฒ๋ฆฌ์ ๊ฐ์ ์ค์ ์ด์ ์ ๋ฐ์ํ์ง ์์ ์ ์๋ ๋ง์ดํฌ๋ก ๋ฒค์น๋งํฌ๋ณด๋ค๋ ์ค์ ๋ถํ ์กฐ๊ฑด์์์ ์ค์ ์ ํ๋ฆฌ์ผ์ด์
์ฒ๋ฆฌ๋, ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ๋ฐ ๋๊ธฐ ์๊ฐ์ ์ง์คํ์ญ์์ค.
๊ธ๋ก๋ฒ ์ํฅ ๋ฐ ๋ฏธ๋ ๋ํฅ
"JavaScript ๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ ์ฑ๋ฅ ์์ง"์ ๋จ์ํ ์ธ์ด ๊ธฐ๋ฅ ์ด์์ ๋๋ค. ์ ๋ณด๊ฐ ๋์ณ๋๋ ์ธ์์์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ ๋ํ ํจ๋ฌ๋ค์์ ์ ํ์ ๋๋ค.
- ๋ง์ดํฌ๋ก์๋น์ค ๋ฐ ์๋ฒ๋ฆฌ์ค: ๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ๋ ์ด๋ฒคํธ ์คํธ๋ฆผ์ ํตํด ํต์ ํ๊ฑฐ๋ ๋๊ท๋ชจ ํ์ด๋ก๋๋ฅผ ๋น๋๊ธฐ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ ๊ฒฌ๊ณ ํ๊ณ ํ์ฅ ๊ฐ๋ฅํ ๋ง์ดํฌ๋ก์๋น์ค๋ฅผ ๊ตฌ์ถํ๋ ๊ฒ์ ๋จ์ํํฉ๋๋ค. ์๋ฒ๋ฆฌ์ค ํ๊ฒฝ์์๋ ํจ์๊ฐ ์์ ๋ฉ๋ชจ๋ฆฌ ์ ํ์ ์์งํ์ง ์๊ณ ๋ ํฐ ๋ฐ์ดํฐ์ ์ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋๋ก ํฉ๋๋ค.
- IoT ๋ฐ์ดํฐ ์ง๊ณ: ์ ์ธ๊ณ์ ๋ฐฐํฌ๋ ์๋ฐฑ๋ง ๊ฐ์ IoT ์ฅ์น์์ ๋ฐ์ดํฐ๋ฅผ ์ง๊ณํ๊ณ ์ฒ๋ฆฌํ๋ ๊ฒฝ์ฐ, ๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ๋ ์ง์์ ์ธ ์ผ์ ํ๋ ๊ฐ์ ์์งํ๊ณ ํํฐ๋งํ๋ ๋ฐ ์์ฐ์ค๋ฝ๊ฒ ์ ํฉํฉ๋๋ค.
- AI/ML ๋ฐ์ดํฐ ํ์ดํ๋ผ์ธ: ๋จธ์ ๋ฌ๋ ๋ชจ๋ธ์ ์ํ ๋ฐฉ๋ํ ๋ฐ์ดํฐ์ ์ ์ค๋นํ๊ณ ๊ณต๊ธํ๋ ์์ ์ ์ข ์ข ๋ณต์กํ ETL ํ๋ก์ธ์ค๋ฅผ ์๋ฐํฉ๋๋ค. ๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ๋ ์ด๋ฌํ ํ์ดํ๋ผ์ธ์ ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ ์ธ ๋ฐฉ์์ผ๋ก ์กฐ์ ํ ์ ์์ต๋๋ค.
- WebRTC ๋ฐ ์ค์๊ฐ ํต์ : ๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ ์์ ์ง์ ๊ตฌ์ถ๋์ง๋ ์์ง๋ง, ์คํธ๋ฆผ ์ฒ๋ฆฌ ๋ฐ ๋น๋๊ธฐ ๋ฐ์ดํฐ ํ๋ฆ์ ๊ธฐ๋ณธ ๊ฐ๋ ์ WebRTC์ ํ์์ ์ด๋ฉฐ, ์ฌ์ฉ์ ์ง์ ๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ๋ ์ค์๊ฐ ์ค๋์ค/๋น๋์ค ์ฒญํฌ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํ ์ด๋ํฐ ์ญํ ์ ํ ์ ์์ต๋๋ค.
- ์น ํ์ค ์งํ: Node.js ๋ฐ ๋ธ๋ผ์ฐ์ ์์ ๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ์ ์ฑ๊ณต์ ์๋ก์ด ์น ํ์ค์ ๊ณ์ ์ํฅ์ ๋ฏธ์ณ ๋น๋๊ธฐ, ์คํธ๋ฆผ ๊ธฐ๋ฐ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ฅผ ์ฐ์ ์ํ๋ ํจํด์ ์ด์งํฉ๋๋ค.
๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ๋ฅผ ์ฑํํจ์ผ๋ก์จ ๊ฐ๋ฐ์๋ ๋ ๋น ๋ฅด๊ณ ์์ ์ ์ผ ๋ฟ๋ง ์๋๋ผ ํ๋ ๋ฐ์ดํฐ์ ๋์ ์ด๊ณ ์ง๋ฆฌ์ ์ผ๋ก ๋ถ์ฐ๋ ํน์ฑ์ ์ฒ๋ฆฌํ๋ ๋ฐ ๋ณธ์ง์ ์ผ๋ก ๋ ์ ๊ฐ์ถฐ์ง ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ ์ ์์ต๋๋ค.
๊ฒฐ๋ก : ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ๋ฏธ๋๋ฅผ ์์ง์ด๋ ํ
JavaScript์ ๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ๋ '์ฑ๋ฅ ์์ง'์ผ๋ก ์ดํดํ๊ณ ํ์ฉ๋ ๋ ํ๋ ๊ฐ๋ฐ์์๊ฒ ํ์์ ์ธ ๋๊ตฌ ์ธํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด๋ ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ๊ด๋ฆฌํ๋ ํ์คํ๋๊ณ ์ฐ์ํ๋ฉฐ ๋งค์ฐ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ ์ ๊ณตํ์ฌ, ์ง์์ ์ผ๋ก ์ฆ๊ฐํ๋ ๋ฐ์ดํฐ ๋ณผ๋ฅจ๊ณผ ๊ธ๋ก๋ฒ ๋ถ์ฐ์ ๋ณต์ก์ฑ ์์์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ฑ๋ฅ์ ์ ์งํ๊ณ , ์๋ต์ฑ์ ๊ฐ์ง๋ฉฐ, ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ ์ด๋๋ก ๋ณด์ฅํฉ๋๋ค.
์ง์ฐ ํ๊ฐ, ์๋ฌต์ ๋ฐฑํ๋ ์ , ์ง๋ฅ์ ์ธ ๋ฆฌ์์ค ๊ด๋ฆฌ๋ฅผ ๋ฐ์๋ค์์ผ๋ก์จ ๋ก์ปฌ ํ์ผ์์ ๋๋ฅ์ ์์ฐ๋ฅด๋ ๋ฐ์ดํฐ ํผ๋์ ์ด๋ฅด๊ธฐ๊น์ง ์์ฝ๊ฒ ํ์ฅ ๊ฐ๋ฅํ ์์คํ ์ ๊ตฌ์ถํ ์ ์์ผ๋ฉฐ, ํ๋ ๋ณต์กํ ๋์ ๊ณผ์ ์๋ ๊ฒ์ ๊ฐ์ํ๋๊ณ ์ต์ ํ๋ ํ๋ก์ธ์ค๋ก ์ ํํ ์ ์์ต๋๋ค. ์ง๊ธ ๋ฐ๋ก ๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ๋ฅผ ์คํํ๊ณ JavaScript ์ ํ๋ฆฌ์ผ์ด์ ์์ ์๋ก์ด ์์ค์ ์ฑ๋ฅ๊ณผ ํ๋ ฅ์ฑ์ ๊ฒฝํํด ๋ณด์ธ์.